#include "registerwidget.h"
#include "ui_registerwidget.h"
#include "global.h"
#include "httpmgr.h"
#include <QRegularExpression>
RegisterWidget::RegisterWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::RegisterWidget)
{
    ui->setupUi(this);
    connect(ui->back_btn,&QPushButton::clicked,
            this,[=](){
        _countdownTimer->stop();
        emit SwitchLoin();
    });
    showTip(tr("欢迎注册"),"normal");

    connect(ui->getCode_btn,&QPushButton::clicked,
            this,&RegisterWidget::getCode);

    connect(ui->register_btn,&QPushButton::clicked,
            this,&RegisterWidget::RegisterIsEmpty);
    connect(HttpMgr::GetInstance().get(),&HttpMgr::SigRegModeFinish,
           this,&RegisterWidget::SlotRegModFinish);



    initHttpHandlers();

    // 初始化定时器
    _timer = new QTimer(this);
    connect(_timer, &QTimer::timeout, this, &RegisterWidget::updateCountdown);



    // 创建定时器
    _countdownTimer = new QTimer(this);
    // 连接信号和槽
    connect(_countdownTimer, &QTimer::timeout, [this](){
        if(_countDown==0){
            _countdownTimer->stop();
            emit SwitchLoin();
            return;
        }
        _countDown--;
        auto str = QString("注册成功，%1 s后返回登录").arg(_countDown);
        showTip(str,"success");
    });

    connectTips();
}

RegisterWidget::~RegisterWidget()
{
    qDebug() << "我被析构了";
    delete ui;
}

void RegisterWidget::Clear()
{
    ui->userName->clear();
    ui->userEmail->clear();
    ui->passwd->clear();
    ui->repasswd->clear();
    ui->varify->clear();
    for(int i=0;i<5;i++)
        count[i] = false;
    _tipErrs.clear();
    _timer->stop();
    _countdownTimer->stop();
    showTip(tr("欢迎注册"),"normal");
    ui->register_btn->setEnabled(true);
    ui->getCode_btn->setEnabled(true);
    ui->getCode_btn->setStyleSheet("");
    ui->getCode_btn->setText(tr("获取"));
}


void RegisterWidget::getCode()
{
    //验证邮箱的地址正则表达式
    auto email = ui->userEmail->text();
    for(int i=0;i<4;i++){
        if(!count[i]){
            showTip(tr("请输入完正确格式"),"err");
            return ;
        }
    }
    //发送http请求获取验证码
    QJsonObject json_obj;
    json_obj["email"] = email;
    json_obj["emailIsExist"] = false;
    qDebug() << gateUrlPrefix+"/get_varifycode";
    HttpMgr::GetInstance()->PostHttpReq(QUrl(gateUrlPrefix+"/get_varifycode"),
                 json_obj, ReqId::ID_GET_VARIFY_CODE,Modules::REGISTERMOD);

    ui->getCode_btn->setEnabled(false);

}

// 启动倒计时
void RegisterWidget::startCountdown()
{
    _remainingTime = 10; // 设置倒计时时间为 60 秒
    ui->getCode_btn->setStyleSheet("color: white;");
    _timer->start(1000); // 启动定时器，每隔 1 秒触发一次
}

void RegisterWidget::updateCountdown()
{
    _remainingTime--; // 减少剩余时间
    ui->getCode_btn->setText(" "+QString::number(_remainingTime)+" "); // 更新显示
    // 如果倒计时结束
    if (_remainingTime <= 0) {
        _timer->stop(); // 停止定时器
        ui->getCode_btn->setEnabled(true);
        ui->getCode_btn->setStyleSheet("");
        ui->getCode_btn->setText(tr("获取"));
    }
}

void RegisterWidget::connectTips()
{
    connect(ui->userName,&QLineEdit::editingFinished,this,[this](){
        if(ui->userName->text() == ""){
            count[0] = false;
            AddTipErr(TipErr::TIP_USER_ERR, tr("用户名不能为空"));
        }else{
            count[0] = true;
            DelTipErr(TipErr::TIP_USER_ERR);
        }
    });

    connect(ui->userEmail, &QLineEdit::editingFinished, this, [this](){
        //验证邮箱的地址正则表达式
        auto email = ui->userEmail->text();
        // 邮箱地址的正则表达式
        QRegularExpression regex(R"((\w+)(\.|_)?(\w*)@(\w+)(\.(\w+))+)");
        bool match = regex.match(email).hasMatch(); // 执行正则表达式匹配
        if(!match){
            count[1] = false;
            //提示邮箱不正确
            AddTipErr(TipErr::TIP_EMAIL_ERR, tr("邮箱地址不正确"));
        }
        else{
            count[1] = true;
            DelTipErr(TipErr::TIP_EMAIL_ERR);
        }
    });

    connect(ui->passwd, &PasswdDialog::alterEidt, this, [this](){
        auto pass = ui->passwd->text();
        if(pass.length() < 6 || pass.length()>15){
            //提示长度不准确
            AddTipErr(TipErr::TIP_PWD_ERR, tr("密码长度应为6~15"));
            count[2] = false;
            return false;
        }
        // 创建一个正则表达式对象，按照上述密码要求
        // 这个正则表达式解释：
        // ^[a-zA-Z0-9!@#$%^&*]{6,15}$ 密码长度至少6，可以是字母、数字和特定的特殊字符
        QRegularExpression regExp("^[a-zA-Z0-9!@#$%^&*]{6,15}$");
        bool match = regExp.match(pass).hasMatch();
        if(!match){
            //提示字符非法
            count[2] = false;
            AddTipErr(TipErr::TIP_PWD_ERR, tr("不能包含非法字符"));
        }
        else{
            count[2] = true;
            DelTipErr(TipErr::TIP_PWD_ERR);
        }
        // 判断密码和确认密码
        auto repass = ui->repasswd->text();
        if(repass != ""){
            if(pass != repass){
                AddTipErr(TipErr::TIP_CONFIRM_ERR, tr("密码与确认密码不正确"));
                count[3] = false;
                return false;
            }
            else{
                DelTipErr(TipErr::TIP_CONFIRM_ERR);
                count[3] = true;
            }
        }
    });

    connect(ui->repasswd, &PasswdDialog::alterEidt, this, [this](){
        auto repass = ui->repasswd->text();
        auto pass = ui->passwd->text();
        qDebug() << pass;
        qDebug() << repass;
        if(pass != repass){
            AddTipErr(TipErr::TIP_CONFIRM_ERR, tr("密码与确认密码不正确"));
            count[3] = false;
            return false;
        }
        else{
            DelTipErr(TipErr::TIP_CONFIRM_ERR);
            count[3] = true;
        }

    });

    connect(ui->varify, &QLineEdit::editingFinished, this, [this](){
        auto pass = ui->varify->text();
        if(pass.isEmpty()){
            AddTipErr(TipErr::TIP_VARIFY_ERR, tr("验证码不能为空"));
            count[4] = false;
            return false;
        }
        else{
            count[4] = true;
            DelTipErr(TipErr::TIP_VARIFY_ERR);
        }

    });
}

void RegisterWidget::AddTipErr(TipErr te, QString tips)
{
    _tipErrs[te] = tips;
    showTip(tips, "err");
}

void RegisterWidget::DelTipErr(TipErr te)
{
    _tipErrs.remove(te);
    if(_tipErrs.empty()){
      showTip("欢迎注册","normal");
      return;
    }

    showTip(_tipErrs.first(), "err");
}

void RegisterWidget::showTip(QString str,QString state)
{

    ui->err_tip->setText(str); // 设置消息
    ui->err_tip->setProperty("state",state);
    repolish(ui->err_tip);
}

void RegisterWidget::SlotRegModFinish(ReqId reqId, QString res, ErrorCodes err)
{
    // 判断是否异常
    if(err != ErrorCodes::SUCCESS){
        qDebug() << err;
        showTip(tr("网络请求错误"),"err");
        ui->getCode_btn->setEnabled(true);
        ui->register_btn->setEnabled(true);
        return ;
    }
    // 解析json
    QJsonDocument jsonDoc = QJsonDocument::fromJson(res.toUtf8());
    if(jsonDoc.isNull() & !jsonDoc.isObject()){
        if(jsonDoc.isNull()){
            qDebug() << "数据为空";
        }else{
            qDebug() << "json解析失败";
        }
        ui->getCode_btn->setEnabled(true);
        ui->register_btn->setEnabled(true);
        showTip(tr("数据解析失败"),"err");
        return ;
    }
    // 调用 reqId对应的function函数
    _handlers[reqId](jsonDoc.object());
    return ;
}

void RegisterWidget::RegisterIsEmpty()
{
    for(auto f : count){
        if(!f){
            showTip(tr("请输入完正确格式"),"err");
            return ;
        }
    }
    qDebug() << "开始注册";
    // 说明都正确 去调用注册功能
    QJsonObject json_obj;
    json_obj["user"] = ui->userName->text();
    json_obj["passwd"] = xorString(ui->passwd->text());// 对密码进行加密操作
    json_obj["email"] = ui->userEmail->text();
    json_obj["varifycode"] = ui->varify->text();
    qDebug() << gateUrlPrefix+"/get_varifycode";
    HttpMgr::GetInstance()->PostHttpReq(QUrl(gateUrlPrefix+"/user_register"),
                                        json_obj, ReqId::ID_REG_USER,Modules::REGISTERMOD);
    ui->register_btn->setEnabled(false);
}

void RegisterWidget::initHttpHandlers()
{
    _handlers.insert(ReqId::ID_GET_VARIFY_CODE,[this](const QJsonObject& jsonObj){
        int error = jsonObj["error"].toInt();
        if(error != ErrorCodes::SUCCESS){
            qDebug() << jsonObj["message"].toString();
            showTip(tr("邮箱已存在"),"err");
            ui->getCode_btn->setEnabled(true);
            return ;
        }
        startCountdown();
        auto email = jsonObj["data"]["email"].toString();
        showTip(tr("验证码已发送邮箱，注意查收"),"success");
        qDebug() << "email is " << email;
    });

    _handlers.insert(ReqId::ID_REG_USER,[this](const QJsonObject& jsonObj){
        int error = jsonObj["error"].toInt();
        if(error != ErrorCodes::SUCCESS){
            qDebug() << jsonObj["message"].toString();
            showTip(tr("参数错误"),"err");
             ui->getCode_btn->setEnabled(true);
            return ;
        }
        _countDown = 5;
        _countdownTimer->start(1000);
        ui->getCode_btn->setEnabled(false);

    });

}
